/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Model;

import java.awt.*;
import java.awt.event.*;
import com.sun.j3d.utils.geometry.*;
import com.sun.j3d.utils.universe.*;
import com.sun.j3d.utils.behaviors.mouse.*;
import javax.media.j3d.*;
import javax.vecmath.*;
/**
 *
 * @author vf
 */
public class View3D extends Frame{

    private DataSet main;
    private Kmeans kmeans;
    private float axisLength;
    private float axisWidth;
    private float objSize;
    private int NActions;

    public View3D(DataSet main, Kmeans kmeans){
        this.main = main;
        this.kmeans = kmeans;
        axisLength = 1f;
        axisWidth = 0.01f;
        objSize = 0.05f;

        NActions = main.getActionNbr();

        this.setLayout(new BorderLayout());
        setTitle("Test java3D");
        setSize(400, 400);
        setLocation(600, 100);

        addWindowListener(
            new WindowAdapter(){
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            }
        );

        Canvas3D canvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
        this.add(canvas3D, BorderLayout.CENTER);

        //Creation d'un simple universe
        SimpleUniverse simpleU = new SimpleUniverse(canvas3D);

        //Initialisation de la vue
        simpleU.getViewingPlatform().setNominalViewingTransform();

        //Creation de la scène
        BranchGroup scene = createScene();
        scene.compile();
        simpleU.addBranchGraph(scene);
    }

    public BranchGroup createScene() {
        float[] coords;
        Appearance appearance;
        // Creation de l'objet parent qui contiendra tous les autres objets 3D
        BranchGroup parent = new BranchGroup();

        // Construction de l'arriere plan de couleur blanche et definition de son rayon d'action
        Background background = new Background(new Color3f(Color.white));
        background.setApplicationBounds(new BoundingBox());
        parent.addChild(background);

        //Creation du transformGroup auquel vont s'appliquer les actions de la souris
        TransformGroup mouseTransform = new TransformGroup();

        //Création d'un branchGroup contenant tous les objets
        BranchGroup actionsBranch = new BranchGroup();

        //Création des sphères représentant les objets
        for (int i=0;i<NActions;i++){
            //Récupère les coordonnées des actions
            coords = main.getActionCoords(i);

            //Creation de la transformation translation
            Transform3D translation = new Transform3D();
            translation.setTranslation(new Vector3f(coords[0], coords[1], coords[2]));
            //Création du transformgroup qui va contenir la translation
            TransformGroup translationTransform = new TransformGroup(translation);

            //Couleur
            appearance = new Appearance();
            if (kmeans == null){//kmeans est null en cas de test de l'affichage
                appearance.setColoringAttributes(
                new ColoringAttributes(
                        new Color3f(Color.blue),//Bleu par default
                        ColoringAttributes.SHADE_FLAT));
            }
            else{
                appearance.setColoringAttributes(
                    new ColoringAttributes(
                            new Color3f(main.getActionColor(i,kmeans)),
                            ColoringAttributes.SHADE_FLAT));
            }
            //Création d'une sphère de la couleur du cluster
            Sphere sphere = new Sphere(objSize,appearance);
            
            //Ajout de la sphere au transformgroup
            translationTransform.addChild(sphere);
            //Ajout du tranformgroup au branchGroup
            actionsBranch.addChild(translationTransform);
        }

        //Ajout du BranchGroup au mouseTransform
        mouseTransform.addChild(actionsBranch);
        
        //Axe X
        mouseTransform.addChild(new Box(axisLength, axisWidth, axisWidth, null));
        //Axe Y
        mouseTransform.addChild(new Box(axisWidth, axisLength, axisWidth, null));
        //Axe Z
        mouseTransform.addChild(new Box(axisWidth, axisWidth, axisLength, null));

        // Autorise la modification de tous les objets du "mousetransform"
        // après compilation de la scène
        mouseTransform.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
        mouseTransform.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

        // Création du comportement de rotation de la souris
        MouseRotate rotate = new MouseRotate(mouseTransform);
        rotate.setSchedulingBounds(new BoundingSphere());
        parent.addChild(rotate);

        // Création du comportement de déplacement de la souris
        MouseTranslate translate = new MouseTranslate(mouseTransform);
        translate.setSchedulingBounds(new BoundingSphere());
        parent.addChild(translate);

        // Création du comportement de zoom de la souris
        MouseZoom zoom = new MouseZoom(mouseTransform);
        zoom.setSchedulingBounds(new BoundingSphere());
        parent.addChild(zoom);

        parent.addChild(mouseTransform);

        return parent;
     }

}
